import axios from 'axios'
import store from '@/store'
import router from '@/router'
import jsonBig from 'json-bigint'

const request = axios.create({
  baseURL: ' http://toutiao-app.itheima.net',

  transformResponse: [
    function (data) {
      try {
        return jsonBig.parse(data)
      } catch (err) {
        return data
      }
    }
  ]
})

// 请求拦截器
request.interceptors.request.use(
  function (config) {
    // 请求发起会经过这里
    // config：本次请求的请求配置对象
    const { user } = store.state
    if (user && user.token) {
      config.headers.Authorization = `Bearer ${user.token}`
    }

    // 注意：这里务必要返回 config 配置对象，否则请求就停在这里出不去了
    return config
  },
  function (error) {
    // 如果请求出错了（还没有发出去）会进入这里
    return Promise.reject(error)
  }
)

// 响应拦截器
// refresh_token刷新token
request.interceptors.response.use(
  function (response) {
    return response
  },
  async function (err) {
    console.dir(err)
    // 有401错错误就执行下面的代码
    if (err.response && err.response.state === 401) {
      const user = store.state.user
      // 没有token就跳转到登录页
      if (!user || !user.refresh_token) {
        return router.push('/login')
      }
      try {
        // 用axios重新请求一个新的token，用request还是会请求一样的
        const res = await axios({
          method: 'PUT',
          url: 'http://toutiao-app.itheima.net/v1_0/authorizations',
          headers: {
            Authorization: `Bearer ${user.refresh_token}`
          }
        })
        console.log('刷新token', res)
        // 将token传回vuex中
        store.commit('setUser', {
          token: res.data.data.token,
          refresh_token: user.refresh_token
        })
        // 按照错误配置的时候，在重新请求
        return request(err.config)
      } catch (err) {
        console.log('请求失败', err)
        router.push('/login')
      }
    }
    return Promise.reject(err)
  }
)

export default request
